import { batchHandle } from '@/utils/commonUtil'

export default {
  data() {
    return {
      // 每个页面的一些自定义属性，以便更好的混入方法
      commonPageSetting: {
        entityTitle: '对象', // 当前页面的对象名称
        entityNameKey: '', // 实体名称的key
        entityIdKey: 'id', // 实体id的key
        listApi: undefined, // 查询列表api
        editApi: undefined, // 新增编辑api
        delApi: undefined, // 删除api
        afterOpenEdit: function(vm) {}, // 在打开新增编辑页面的自定义操作
        beforeSendEdit: function(vm) { return true }, // 在发送编辑数据的自定义操作，返回false将会取消更新
        resetTemp: function(vm) {} // 重置缓存实体信息
      },
      listLoading: true,
      selectIds: [], // checkbox多选
      tableData: [], // 完整的表格数据
      filterTableData: [], // 前端搜索之后的数据
      pageSize: 10, // 每页大小默认值
      pageIndex: 1, // 默认第一页
      // 编辑/新增表单
      edit: {
        visible: false,
        status: '', // edit或者add
        temp: {
        },
        tempOld: {} // 以便恢复
      }
    }
  },
  computed: {
    // 总数
    total() {
      return this.filterTableData.length
    },
    // 当前分页数据
    pageData() {
      return this.filterTableData.slice((this.pageIndex - 1) * this.pageSize, this.pageIndex * this.pageSize)
    },
    // 动态的查询参数
    listParams() {
      return undefined
    }
  },
  created() {
    this.edit.tempOld = Object.assign({}, this.edit.temp)
    this.getData()
  },
  watch: {
    tableData() {
      this.pageIndex = 1
    },
    filterTableData() {
      this.pageIndex = 1
    }
  },
  methods: {
    // 多选checkbox
    selectRowHandle(selection) {
      this.selectIds = []
      const self = this
      selection.forEach(function(row) {
        self.selectIds.push(row.id)
      })
    },
    // 重置实体
    resetTemp() {
      this.edit.temp = Object.assign({}, this.edit.tempOld)
      this.commonPageSetting.resetTemp(this)
    },
    // 更新
    updateHandle(row) {
      this.edit.visible = true
      this.edit.status = 'update'
      Object.assign(this.edit.temp, row)
      this.commonPageSetting.afterOpenEdit(this)
      this.$nextTick(() => {
        this.$refs.dataForm.clearValidate()
      })
    },
    // 删除
    deleteHandle(row) {
      this.$confirm('是否删除' + this.commonPageSetting.entityTitle + ' 【' + row[this.commonPageSetting.entityNameKey] + '】 ?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        this.commonPageSetting.delApi({ id: row[this.commonPageSetting.entityIdKey] }).then(response => {
          this.getData()
          this.$message.success('删除成功')
        })
      }).catch(() => {})
    },
    // 新增
    createHandle() {
      this.resetTemp()
      this.edit.visible = true
      this.edit.status = 'create'
      this.commonPageSetting.afterOpenEdit(this)
      this.$nextTick(() => {
        this.$refs.dataForm.clearValidate()
      })
    },
    // 新增或者修改数据
    updateOrAddData() {
      const flag = this.commonPageSetting.beforeSendEdit(this)
      if (!flag) {
        return
      }

      this.$refs.dataForm.validate((validate) => {
        if (validate) {
          this.commonPageSetting.editApi(this.edit.temp).then(response => {
            this.getData()
            this.$message.success((this.edit.status === 'update' ? '更新' : '新增') + '成功')
            this.edit.visible = false
          })
        }
      })
    },
    // 过滤
    handleFilter() {
      const data = []
      Object.assign(data, this.tableData)
      this.filterTableData = this.selfHandleFilter(data)
    },
    // 详细的过滤操作，需要覆写此方法
    selfHandleFilter(data) {
      return data
    },
    // 前端分页：分页大小变化
    handleSizeChange(val) {
      this.pageSize = val
    },
    // 前端分页： 当前页码改变
    handleCurrentChange(val) {
      this.pageIndex = val
    },
    // 模拟同步批量删除
    batchDel() {
      const self = this
      batchHandle({
        vm: self,
        opName: '删除',
        data: self.selectIds,
        opHandle(val, resolve, reject) {
          self.commonPageSetting.delApi({ id: val }).then(() => {
            resolve()
          }).catch(() => {
            reject()
          })
        },
        finishCallback(successCount, failCount) {
          self.getData()
        }
      })
    },
    // 表格排序
    tableSortChange({ column, prop, order }) {
      if (order === null) {
        this.handleFilter()
        return false
      }
      this.filterTableData.sort(function(a, b) {
        return order === 'ascending' ? a[prop] - b[prop] : b[prop] - a[prop]
      })
    },
    // 刷新当前表格
    refreshTable() {
      this.getData()
    },
    // 获取数据
    async getData() {
      this.listLoading = true
      await this.commonPageSetting.listApi(this.listParams).then(response => {
        this.tableData = response.data
        this.handleFilter()
      })
      this.listLoading = false
    }
  }
}
